package com.shujia.spark.mllib

import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Demo3Person {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("point")
      .config("spark.sql.shuffle.partitions", 1)
      .getOrCreate()

    import spark.implicits._
    import org.apache.spark.sql.functions._

    val dataDF: DataFrame = spark
      .read
      .format("libsvm") //读取svm格式的数据
      .load("data/人体指标.txt")

    dataDF.show()


    /**
     * 1、将已经做好特征工程的数据拆分成训练数据和测试数据
     *
     */

    //randomSplit随机拆分数据
    val Array(train: DataFrame, test: DataFrame) = dataDF.randomSplit(Array(0.8, 0.2))

    /**
     * 选择算法，这里是一个分类问题，可以选择逻辑回归
     *
     */

    val logisticRegression = new LogisticRegression()

    /**
     * 将训练数据带入算法训练模型
     *
     */

    val model: LogisticRegressionModel = logisticRegression.fit(train)

    /**
     * 测试机带入模型测试模型的准确率
     *
     */
    val testDF: DataFrame = model.transform(test)

    /**
     * 计算准确率
     *
     */
    val p: Double = testDF.where($"label" === $"prediction").count().toDouble / testDF.count()

    println(s"模型的准确率：$p")

    /**
     * 如果模型还可以，将摸摸胸保存起来， 后面使用
     *
     */
    model
      .write
      .overwrite()
      .save("data/person_model")

  }

}
